์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ๋ฐ ํ์ธํธ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ์ดํดํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํํ์ธ์. ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ๋ ๋น ๋ฅด๊ณ ๋ถ๋๋ฌ์ด ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ธฐ์ ์ ๋ฐฐ์๋ณด์ธ์.
๋ธ๋ผ์ฐ์ ๋ ๋๋ง ์ต์ ํ: ์๋ฐ์คํฌ๋ฆฝํธ ํ์ธํธ ์ฑ๋ฅ ์ฌ์ธต ๋ถ์
์ค๋๋ ๋น ๋ฅด๊ฒ ๋ณํํ๋ ๋์งํธ ์ธ์์์ ์ฌ์ฉ์๋ค์ ์น์ฌ์ดํธ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ์์ฑ์ด ๋ฐ์ด๋๊ณ ์ฑ๋ฅ์ด ์ข๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค. ๋๋ฆฌ๊ฑฐ๋ ๋ฒ๋ฒ ์ด๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค(UI)๋ ๋ถ๋ง์ผ๋ก ์ด์ด์ ธ ๊ฒฐ๊ตญ ์ฌ์ฉ์์ ์ดํ์ ์ด๋ํ ์ ์์ต๋๋ค. ์น ์ฑ๋ฅ์ ์ค์ํ ์ธก๋ฉด์ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ด๋ฉฐ, ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ํ์ธํธ(paint) ๋จ๊ณ์ ๋ฏธ์น๋ ์ํฅ์ ์ดํดํ๋ ๊ฒ์ ์ต์ ํ๋ ์น ๊ฒฝํ์ ๊ตฌ์ถํ๋ ๋ฐ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ์ด ๊ฐ์ด๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ธํธ ์ฑ๋ฅ์ ์ข ํฉ์ ์ผ๋ก ์ดํด๋ณด๊ณ , ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์์ฑ์ ๊ฐ์ ํ ์ ์๋ ์ค์ฉ์ ์ธ ์ ๋ต๊ณผ ๊ธฐ์ ์ ์ ๊ณตํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ ์ดํดํ๊ธฐ
๋ธ๋ผ์ฐ์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ์น ๋ธ๋ผ์ฐ์ ๊ฐ HTML, CSS, ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ฌ์ฉ์ ํ๋ฉด์ ์๊ฐ์ ์ผ๋ก ํ์ํ๊ธฐ ์ํด ๊ฑฐ์น๋ ์ผ๋ จ์ ๋จ๊ณ์ ๋๋ค. ์ด ํ์ดํ๋ผ์ธ์ ์ต์ ํํ๋ ๊ฒ์ ๋ถ๋๋ฝ๊ณ ์ฑ๋ฅ ์ข์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ํต์ฌ์ ์ ๋๋ค. ์ฃผ์ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- DOM ์์ฑ: ๋ธ๋ผ์ฐ์ ๋ HTML์ ํ์ฑํ์ฌ HTML ๊ตฌ์กฐ๋ฅผ ํธ๋ฆฌ ํํ๋ก ํํํ ๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ(DOM)์ ์์ฑํฉ๋๋ค.
- CSSOM ์์ฑ: ๋ธ๋ผ์ฐ์ ๋ CSS๋ฅผ ํ์ฑํ์ฌ CSS ๊ท์น์ ํธ๋ฆฌ ํํ๋ก ํํํ CSS ๊ฐ์ฒด ๋ชจ๋ธ(CSSOM)์ ์์ฑํฉ๋๋ค.
- ๋ ๋ ํธ๋ฆฌ ์์ฑ: ๋ธ๋ผ์ฐ์ ๋ DOM๊ณผ CSSOM์ ๊ฒฐํฉํ์ฌ ํ๋ฉด์ ๋ณด์ด๋ ๋ ธ๋์ ๊ทธ ์คํ์ผ๋ง ํฌํจํ๋ ๋ ๋ ํธ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
- ๋ ์ด์์(Layout): ๋ธ๋ผ์ฐ์ ๋ ๋ ๋ ํธ๋ฆฌ์ ๊ฐ ์์์ ํฌ๊ธฐ์ ์์น๋ฅผ ๊ณ์ฐํ์ฌ ํ๋ฉด์ ์ด๋์ ํ์๋ ์ง ๊ฒฐ์ ํฉ๋๋ค. ์ด ๊ณผ์ ์ ๋ฆฌํ๋ก์ฐ(Reflow)๋ผ๊ณ ๋ ํฉ๋๋ค.
- ํ์ธํธ(Paint): ๋ธ๋ผ์ฐ์ ๋ ๋ ๋ ํธ๋ฆฌ๋ฅผ ํ๋ฉด์ ์ค์ ํฝ์ ๋ก ๋ณํํฉ๋๋ค. ์ด ๊ณผ์ ์ ๋์คํฐํ(Rasterization)๋ผ๊ณ ๋ ํฉ๋๋ค.
- ํฉ์ฑ(Composite): ๋ธ๋ผ์ฐ์ ๋ ํ์ด์ง์ ์ฌ๋ฌ ๋ ์ด์ด๋ฅผ ๊ฒฐํฉํ์ฌ ์ต์ข ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ ์ฌ์ฉ์์๊ฒ ํ์ํฉ๋๋ค.
ํ์ธํธ ์ฑ๋ฅ์์ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ญํ
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฌ๋ฌ ๋ฐฉ์์ผ๋ก ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ํ์ธํธ ๋จ๊ณ์ ์๋นํ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค:
- ์คํ์ผ ์ง์ ์กฐ์: ์๋ฐ์คํฌ๋ฆฝํธ๋ ์์์ CSS ์คํ์ผ์ ์ง์ ์์ ํ์ฌ ๋ฆฌํ์ธํธ์ ๋ฆฌํ๋ก์ฐ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ์ฆ๊ฑฐ๋ ์ต์ ํ๋์ง ์์ ์คํ์ผ ๋ณ๊ฒฝ์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์ด๋ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฃจํ ์์์ ์์์ `left`์ `top` ์์ฑ์ ๋ฐ๋ณต์ ์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ์ฌ๋ฌ ๋ฒ์ ๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
- DOM ์กฐ์: DOM์ ์์๋ฅผ ์ถ๊ฐ, ์ ๊ฑฐ ๋๋ ์์ ํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ๋ ์ด์์์ ๋ค์ ๊ณ์ฐํ๊ณ ์ํฅ์ ๋ฐ๋ ์์ญ์ ๋ค์ ๊ทธ๋ ค์ผ ํ๋ฏ๋ก ๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ ์ ํ ์ต์ ํ ์์ด ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๋ง์ ์์ ์์๋ฅผ ์ถ๊ฐํ๋ฉด ์ฑ๋ฅ์ด ํฌ๊ฒ ์ ํ๋ ์ ์์ต๋๋ค.
- ์ ๋๋ฉ์ด์ : ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ์ ์ต์ ํ๋์ง ์์ ๊ฒฝ์ฐ ๋งค ํ๋ ์๋ง๋ค ๋ฆฌํ์ธํธ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ์ ๋๋ฉ์ด์ ์์ `left`, `top`, `width`, `height`์ ๊ฐ์ ์์ฑ์ ์ง์ ์ฌ์ฉํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ๋ ์ด์์์ ๋ค์ ๊ณ์ฐํ๊ฒ ๋์ด ์ฑ๋ฅ ์ ํ๋ก ์ด์ด์ง๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
- ๋ณต์กํ ๊ณ์ฐ: ๋ณต์กํ ๊ณ์ฐ์ด๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ฌ ํ์ธํธ ๋จ๊ณ๋ฅผ ์ง์ฐ์ํค๊ณ UI๊ฐ ์๋ตํ์ง ์๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ๋ณต์กํ ์๊ฐํ๋ฅผ ์์ฑํ๊ธฐ ์ํด ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ๋ฅผ ์์ํด ๋ณด์ธ์. ์ด ์ฒ๋ฆฌ๊ฐ ๋ฉ์ธ ์ค๋ ๋์์ ๋ฐ์ํ๋ฉด ๋ ๋๋ง์ ์ฐจ๋จํ ์ ์์ต๋๋ค.
ํ์ธํธ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์ ์๋ณํ๊ธฐ
์ต์ ํ๋ฅผ ์์ํ๊ธฐ ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ํ์ธํธ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. Chrome ๊ฐ๋ฐ์ ๋๊ตฌ(๋๋ ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์ ์ ์ฌํ ๋๊ตฌ)๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ง๋จํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Chrome ๊ฐ๋ฐ์ ๋๊ตฌ ์ด๊ธฐ: F12 ํค(macOS์์๋ Cmd+Opt+I)๋ฅผ ๋๋ฌ Chrome ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฝ๋๋ค.
- Performance ํญ์ผ๋ก ์ด๋: "Performance" ํญ์ ์ ํํฉ๋๋ค.
- ์ฑ๋ฅ ํ๋กํ ๊ธฐ๋ก: ๊ธฐ๋ก ๋ฒํผ(์ํ ๋ฒํผ)์ ํด๋ฆญํ๊ณ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ํธ ์์ฉํ์ฌ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ ๋ฐํฉ๋๋ค.
- ๊ธฐ๋ก ์ค์ง: ๊ธฐ๋ก ๋ฒํผ์ ๋ค์ ํด๋ฆญํ์ฌ ๊ธฐ๋ก์ ์ค์งํฉ๋๋ค.
- ํ์๋ผ์ธ ๋ถ์: ํ์๋ผ์ธ์ ๊ฒํ ํ์ฌ ๊ธด ํ์ธํธ ์๊ฐ, ๊ณผ๋ํ ๋ฆฌํ๋ก์ฐ(๋ ์ด์์ ๊ณ์ฐ), ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์คํ์ ์๋ณํฉ๋๋ค. "Rendering" ์น์ ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ธ์. ์ด ๋ถ๋ถ์ ํ์ธํธ ์ด๋ฒคํธ๋ฅผ ๊ฐ์กฐ ํ์ํฉ๋๋ค. ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๋ํ๋ด๋ ๋นจ๊ฐ์ ์์ญ์ ์ฐพ์ผ์ธ์. ํ๋จ์ "Summary" ํญ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์๊ฐ์ ์ด๋์ ์๋นํ๋์ง์ ๋ํ ๊ฐ์๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
- Paint Flashing ํ์ฑํ: Rendering ํญ(๊ฐ๋ฐ์ ๋๊ตฌ์ ์ธ ์ ๋ฉ๋ด๋ฅผ ํตํด ์ ๊ทผ ๊ฐ๋ฅ)์์ "Paint flashing"์ ํ์ฑํํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ๋ฉด์์ ๋ค์ ๊ทธ๋ ค์ง๋ ์์ญ์ด ๊ฐ์กฐ ํ์๋ฉ๋๋ค. ์ฆ์ ๊น๋ฐ์์ ์ ์ฌ์ ์ธ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๋ํ๋ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ํ์ธํธ ์ฑ๋ฅ ์ต์ ํ ์ ๋ต
๋ณ๋ชฉ ํ์์ ์๋ณํ๋ค๋ฉด, ๋ค์ ์ ๋ต์ ์ ์ฉํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ธํธ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค:
1. ๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ ์ต์ํํ๊ธฐ
๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ๋ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ ๋๋ค. ์ด ์์ ์ด ๋ฐ์ํ๋ ํ์๋ฅผ ์ค์ด๋ ๊ฒ์ด ์ฑ๋ฅ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ช ๊ฐ์ง ๊ธฐ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ง์ ์ ์ธ ์คํ์ผ ์กฐ์ ํผํ๊ธฐ: ๊ฐ๋ณ ์์์ ์คํ์ผ์ ์ง์ ์์ ํ๋ ๋์ , ํด๋์ค ์ด๋ฆ์ ๋ณ๊ฒฝํ๊ฑฐ๋ CSS ๋ณ์๋ฅผ ์์ ํด ๋ณด์ธ์. ์ด๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ๋ ์ ๋ฐ์ดํธ๋ฅผ ์ผ๊ด ์ฒ๋ฆฌํ๊ณ ๋ ๋๋ง ํ๋ก์ธ์ค๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, `element.style.width = '100px'` ๋์ ๋๋น๋ฅผ ์ ์ํ๋ ํด๋์ค๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.
- DOM ์ ๋ฐ์ดํธ ์ผ๊ด ์ฒ๋ฆฌํ๊ธฐ: DOM์ ์ฌ๋ฌ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ ๋๋ ์ด๋ฅผ ํจ๊ป ๋ฌถ์ด ๋ฆฌํ๋ก์ฐ ํ์๋ฅผ ์ต์ํํ์ธ์. document fragment๋ ์์ ๋ณ์์ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ๋ชจ์ ํ DOM์ ์ ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฃจํ์์ DOM์ ์์๋ฅผ ํ๋์ฉ ์ถ๊ฐํ๋ ๋์ , document fragment์ ์ถ๊ฐํ ๋ค์ ๊ทธ fragment๋ฅผ ํ ๋ฒ์ DOM์ ์ถ๊ฐํ์ธ์.
- ๋ ์ด์์ ์์ฑ ์ ์คํ๊ฒ ์ฝ๊ธฐ: `offsetWidth`, `offsetHeight`, `scrollTop`๊ณผ ๊ฐ์ ๋ ์ด์์ ์์ฑ์ ์ฝ์ผ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๊ฐ์ ๋ก ๋ ์ด์์์ ๋ค์ ๊ณ์ฐํฉ๋๋ค. ํนํ ๋ฃจํ ๋ด์์ ๋ถํ์ํ๊ฒ ์ด๋ฌํ ์์ฑ์ ์ฝ๋ ๊ฒ์ ํผํ์ธ์. ์ฌ์ฉํด์ผ ํ๋ค๋ฉด ๊ฐ์ ์บ์ํ์ฌ ์ฌ์ฌ์ฉํ์ธ์.
- ์ ๋๋ฉ์ด์ ์ `requestAnimationFrame` ์ฌ์ฉํ๊ธฐ: `requestAnimationFrame`์ ๋ค์ ๋ฆฌํ์ธํธ๊ฐ ์คํ๋๊ธฐ ์ ์ ์ ๋๋ฉ์ด์ ์ ์คํํ๋๋ก ์์ฝํ๋ ๋ธ๋ผ์ฐ์ API์ ๋๋ค. ์ด๋ฅผ ํตํด ์ ๋๋ฉ์ด์ ์ด ๋ธ๋ผ์ฐ์ ์ ์ฃผ์ฌ์จ๊ณผ ๋๊ธฐํ๋์ด ๋ ๋ถ๋๋ฝ๊ณ ํจ์จ์ ์ธ ๋ ๋๋ง์ด ๊ฐ๋ฅํด์ง๋๋ค. ์ ๋๋ฉ์ด์ ์ `setInterval`์ด๋ `setTimeout` ๋์ `requestAnimationFrame`์ ์ฌ์ฉํ์ธ์.
- ๊ฐ์ DOM๊ณผ ์ฌ์กฐ์ (React, Vue.js, Angular์ ๊ฐ์ ํ๋ ์์ํฌ์ ๊ฒฝ์ฐ): ๊ฐ์ DOM์ ์ฌ์ฉํ๋ ํ๋ ์์ํฌ๋ ์ง์ ์ ์ธ DOM ์กฐ์์ ์ต์ํํฉ๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ๋จผ์ ๊ฐ์ DOM์ ์ ์ฉ๋ ๋ค์, ํ๋ ์์ํฌ๊ฐ ์ฐจ์ด์ (์ฌ์กฐ์ )์ ๊ธฐ๋ฐ์ผ๋ก ์ค์ DOM์ ํจ์จ์ ์ผ๋ก ์ ๋ฐ์ดํธํฉ๋๋ค. ์ฌ์ฉํ๋ ํ๋ ์์ํฌ๊ฐ DOM ์ ๋ฐ์ดํธ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
2. ์ ๋๋ฉ์ด์ ์ CSS Transform๊ณผ Opacity ํ์ฉํ๊ธฐ
์์์ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํ ๋๋ CSS transform(์: `translate`, `scale`, `rotate`)๊ณผ opacity๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ฌํ ์์ฑ๋ค์ ์ผ๋ฐ์ ์ผ๋ก GPU์์ ์ฒ๋ฆฌ๋๋ฏ๋ก ๋ฆฌํ๋ก์ฐ๋ฅผ ์ ๋ฐํ์ง ์๊ณ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํ ์ ์์ต๋๋ค. `left`, `top`, `width`, `height`์ ๊ฐ์ ์์ฑ์ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํ๋ ๊ฒ์ ๋ ์ด์์ ์ฌ๊ณ์ฐ์ ๊ฐ์ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ํจ์ฌ ๋ ๋น์ฉ์ด ๋ง์ด ๋ญ๋๋ค.
์๋ฅผ ๋ค์ด, ์์๋ฅผ ์ํ์ผ๋ก ์ด๋์ํค๊ธฐ ์ํด `left` ์์ฑ์ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํ๋ ๋์ `transform: translateX(value)`๋ฅผ ์ฌ์ฉํ์ธ์. ๋ง์ฐฌ๊ฐ์ง๋ก, `display` ์์ฑ์ ์ง์ ์กฐ์ํ๋ ๋์ `opacity`๋ฅผ ์ฌ์ฉํ์ธ์.
3. ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์ต์ ํ
ํจ์จ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ ํ์ธํธ ๋จ๊ณ๋ฅผ ์ง์ฐ์ํฌ ์ ์๋ ๋ณ๋ชฉ ํ์์ ๋ฐฉ์งํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ๋ช ๊ฐ์ง ๊ณ ๋ ค ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์๋ฐ์คํฌ๋ฆฝํธ ์คํ ์๊ฐ ์ต์ํํ๊ธฐ: ๋๋ฆฌ๊ฒ ์คํ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์๋ณํ๊ณ ์ต์ ํํ์ธ์. Chrome ๊ฐ๋ฐ์ ๋๊ตฌ์ Performance ํญ์ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ํ๋กํ์ผ๋งํ๊ณ ๊ฐ์ฅ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ํจ์๋ฅผ ์ฐพ์ผ์ธ์.
- ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ์ํ ์น ์์ปค(Web Workers): ์ค๋ ์คํ๋๊ฑฐ๋ ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ์น ์์ปค๋ก ์ฎ๊ธฐ์ธ์. ์น ์์ปค๋ ๋ณ๋์ ์ค๋ ๋์์ ์คํ๋๋ฏ๋ก ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ๊ฑฐ๋ ๋ ๋๋ง์ ๋ฐฉํดํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ด๋ฏธ์ง ์ฒ๋ฆฌ, ๋ฐ์ดํฐ ๋ถ์ ๋๋ ๋คํธ์ํฌ ์์ฒญ์ ์น ์์ปค์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ๋๋ฐ์ด์ฑ(Debouncing)๊ณผ ์ฐ๋กํ๋ง(Throttling): ์คํฌ๋กค์ด๋ ์ฐฝ ํฌ๊ธฐ ์กฐ์ ๊ณผ ๊ฐ์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ๋ ๋๋ฐ์ด์ฑ์ด๋ ์ฐ๋กํ๋ง์ ์ฌ์ฉํ์ฌ ํจ์ ์คํ ํ์๋ฅผ ์ ํํ์ธ์. ์ด๋ฅผ ํตํด ๊ณผ๋ํ ๋ฆฌํ์ธํธ์ ๋ฆฌํ๋ก์ฐ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ๋๋ฐ์ด์ฑ์ ํน์ ๋นํ์ฑ ๊ธฐ๊ฐ ํ์๋ง ํจ์๊ฐ ํธ์ถ๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ฐ๋กํ๋ง์ ์ง์ ๋ ์๊ฐ ๊ฐ๊ฒฉ ๋ด์ ํจ์๊ฐ ์ต๋ ํ ๋ฒ๋ง ํธ์ถ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ์ฝ๋ ์คํ๋ฆฌํ (Code Splitting): ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ ์์ ๋ฉ์ด๋ฆฌ๋ก ๋๋๊ณ ํ์ํ ๋ ๋ก๋ํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ์ค์ด๊ณ ๋ฐ์์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. Webpack์ด๋ Parcel๊ณผ ๊ฐ์ ๋๊ตฌ๊ฐ ์ฝ๋ ์คํ๋ฆฌํ ์ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ํจ์จ์ ์ธ ์๋ฃ ๊ตฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ: ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ต์ ํํ๊ธฐ ์ํด ์ ์ ํ ์๋ฃ ๊ตฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ธ์. ์ฑ๋ฅ์ด ์ค์ํ ๊ฒฝ์ฐ ๊ฐ์ฒด๋ ๋ฐฐ์ด ๋์ Map์ด๋ Set ์ฌ์ฉ์ ๊ณ ๋ คํด ๋ณด์ธ์.
4. ํ๋์จ์ด ๊ฐ์ ์ฌ์ฉํ๊ธฐ
๋ธ๋ผ์ฐ์ ๋ GPU(๊ทธ๋ํฝ ์ฒ๋ฆฌ ์ฅ์น)๋ฅผ ํ์ฉํ์ฌ ํฉ์ฑ ๋ฐ ๋ณํ๊ณผ ๊ฐ์ ํน์ ๋ ๋๋ง ์์ ์ ๊ฐ์ํํ ์ ์์ต๋๋ค. ์๋ก์ด ํฉ์ฑ ๋ ์ด์ด๋ฅผ ์์ฑํ๋ CSS ์์ฑ์ ์ฌ์ฉํ์ฌ ํ๋์จ์ด ๊ฐ์์ ์ ๋ํ์ธ์. `will-change` CSS ์์ฑ์ด ์์ฃผ ์ฌ์ฉ๋์ง๋ง, ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์ผ๋ฏ๋ก ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์์:
.element {
will-change: transform, opacity;
}
์ด๋ ๋ธ๋ผ์ฐ์ ์๊ฒ ํด๋น ์์์ `transform`๊ณผ `opacity` ์์ฑ์ด ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๊ณ ์๋ ค์ฃผ์ด ๋ ๋๋ง์ ๊ทธ์ ๋ง๊ฒ ์ต์ ํํ ์ ์๋๋ก ํฉ๋๋ค.
5. ์ด๋ฏธ์ง ๋ฐ ๊ธฐํ ์์ฐ ์ต์ ํํ๊ธฐ
ํฐ ์ด๋ฏธ์ง์ ๊ธฐํ ์์ฐ์ ํ์ด์ง ๋ก๋ ์๊ฐ๊ณผ ๋ ๋๋ง ์ฑ๋ฅ์ ํฐ ์ํฅ์ ์ค ์ ์์ต๋๋ค. ์์ฐ์ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ๋ก๋ฉ ์๋๋ฅผ ํฅ์์ํค๊ธฐ ์ํด ์ต์ ํํ์ธ์.
- ์ด๋ฏธ์ง ์ต์ ํ: ImageOptim์ด๋ TinyPNG์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ง ์ ํ ์์ด ์ด๋ฏธ์ง๋ฅผ ์์ถํ์ธ์. ์ด๋ฏธ์ง ๋ด์ฉ์ ๋ฐ๋ผ ์ ์ ํ ์ด๋ฏธ์ง ํ์(์: WebP, JPEG, PNG)์ ์ ํํ์ธ์. `srcset` ์์ฑ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ๊ธฐ๊ธฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ํฌ๊ธฐ์ ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํ๋ ๋ฐ์ํ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ์ธ์.
- ์ง์ฐ ๋ก๋ฉ(Lazy Loading): ์ด๋ฏธ์ง ๋ฐ ๊ธฐํ ์์ฐ์ ๋ทฐํฌํธ์ ๋ณด์ผ ๋๋ง ๋ก๋ํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ํฌ๊ฒ ๊ฐ์ ํ๊ณ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ ๋๋งํด์ผ ํ๋ ๋ฆฌ์์ค์ ์์ ์ค์ผ ์ ์์ต๋๋ค. lazysizes์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ง์ฐ ๋ก๋ฉ์ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์บ์ฑ(Caching): ๋ธ๋ผ์ฐ์ ์บ์ฑ์ ํ์ฉํ์ฌ ์ ์ ์์ฐ์ ๋ก์ปฌ์ ์ ์ฅํจ์ผ๋ก์จ ๋ฐ๋ณต์ ์ธ ๋ค์ด๋ก๋ ํ์์ฑ์ ์ค์ด์ธ์. ์๋ฒ์์ ์ ์ ํ ์บ์ ํค๋๋ฅผ ์ค์ ํ๋๋ก ๊ตฌ์ฑํ์ธ์. ์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ(CDN)๋ฅผ ์ฌ์ฉํ์ฌ ์์ฐ์ ์ ์ธ๊ณ์ ๋ฐฐํฌํ๊ณ ์ ์ธ๊ณ ์ฌ์ฉ์์ ๋ก๋ฉ ์๊ฐ์ ๊ฐ์ ํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.
6. ๋ชจ๋ํฐ๋ง ๋ฐ ์ง์์ ์ธ ๊ฐ์
์น ์ฑ๋ฅ ์ต์ ํ๋ ์ง์์ ์ธ ๊ณผ์ ์ ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ๊ฐ์ ํ ์์ญ์ ์ฐพ์ผ์ธ์. Google PageSpeed Insights, WebPageTest, Lighthouse์ ๊ฐ์ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ป๊ณ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ์ธ์. ์ ๊ธฐ์ ์ผ๋ก ์ฝ๋๋ฅผ ํ๋กํ์ผ๋งํ๊ณ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ๋ถ์ํ์ฌ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ํด๊ฒฐํ์ธ์.
์น ์ฑ๋ฅ์ ๋ํ ๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ
์น ์ฑ๋ฅ์ ์ต์ ํํ ๋๋ ๊ธ๋ก๋ฒ ์ปจํ ์คํธ๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ธ๊ณ ๊ฐ์ง์ ์ฌ์ฉ์๋ค์ ๋ค์ํ ๋คํธ์ํฌ ์๋, ๊ธฐ๊ธฐ ์ฑ๋ฅ, ์ธํฐ๋ท ์ ์ ๋น์ฉ์ ๊ฐ์ง ์ ์์ต๋๋ค.
- ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ(Latency): ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ์ ํนํ ์ธํฐ๋ท ์ธํ๋ผ๊ฐ ์ด์ ํ ์ง์ญ์ ์ฌ์ฉ์์๊ฒ ํ์ด์ง ๋ก๋ ์๊ฐ์ ํฐ ์ํฅ์ ์ค ์ ์์ต๋๋ค. HTTP ์์ฒญ ์๋ฅผ ์ต์ํํ๊ณ ์์ฐ ํฌ๊ธฐ๋ฅผ ์ต์ ํํ์ฌ ์ง์ฐ ์๊ฐ์ ์ํฅ์ ์ค์ด์ธ์. ๋จ์ผ ์ฐ๊ฒฐ์ ํตํด ์ฌ๋ฌ ์์ฒญ์ ๋ณด๋ผ ์ ์๋ HTTP/2์ ๊ฐ์ ๊ธฐ์ ์ฌ์ฉ์ ๊ณ ๋ คํด ๋ณด์ธ์.
- ๊ธฐ๊ธฐ ์ฑ๋ฅ: ๊ฐ๋ฐ๋์๊ตญ์ ์ฌ์ฉ์๋ค์ ๊ตฌํ์ด๊ฑฐ๋ ์ฑ๋ฅ์ด ๋ฎ์ ๊ธฐ๊ธฐ๋ฅผ ์ฌ์ฉํ๊ณ ์์ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ๊ธฐ์์๋ ์ ์๋ํ๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํํ์ธ์. ์ฌ์ฉ์์ ๊ธฐ๊ธฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํ๋ ์ ์ํ ๋ก๋ฉ ๊ธฐ์ ์ฌ์ฉ์ ๊ณ ๋ คํด ๋ณด์ธ์.
- ๋ฐ์ดํฐ ๋น์ฉ: ์ผ๋ถ ์ง์ญ์์๋ ์ธํฐ๋ท ์ ์ ๋น์ฉ์ด ๋น์๋๋ค. ๋ฐ์ดํฐ ์ฌ์ฉ๋์ ์ต์ํํ๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํํ์ธ์. ์ด๋ฏธ์ง ์์ถ, ์ฝ๋ ์คํ๋ฆฌํ , ์ง์ฐ ๋ก๋ฉ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ๋ค์ด๋ก๋ํด์ผ ํ๋ ๋ฐ์ดํฐ ์์ ์ค์ด์ธ์.
- ํ์งํ(Localization): ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค๋ฅธ ์ธ์ด์ ์ง์ญ์ ๋ง๊ฒ ์ ์ ํ ํ์งํ๋์๋์ง ํ์ธํ์ธ์. ์ ์ ํ ๋ฌธ์ ์ธ์ฝ๋ฉ๊ณผ ์์ ๊ท์น์ ์ฌ์ฉํ์ธ์. ์์ฐ์ ์ ์ธ๊ณ์ ๋ฐฐํฌํ๋ CDN์ ์ฌ์ฉํ์ฌ ์ ์ธ๊ณ ์ฌ์ฉ์์ ๋ก๋ฉ ์๊ฐ์ ๊ฐ์ ํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.
์์: ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ์ต์ ํ
ํ๋ฉด์ ๊ฐ๋ก์ง๋ฌ ์ํ์ผ๋ก ์์๋ฅผ ์์ง์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค:
const element = document.getElementById('my-element');
let position = 0;
function animate() {
position += 2;
element.style.left = position + 'px';
requestAnimationFrame(animate);
}
animate();
์ด ์ฝ๋๋ `left` ์์ฑ์ ์ง์ ์กฐ์ํ์ฌ ๋งค ํ๋ ์๋ง๋ค ๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ๋ฅผ ์ ๋ฐํฉ๋๋ค. ์ด ์ ๋๋ฉ์ด์ ์ ์ต์ ํํ๋ ค๋ฉด CSS transform์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
const element = document.getElementById('my-element');
let position = 0;
function animate() {
position += 2;
element.style.transform = `translateX(${position}px)`;
requestAnimationFrame(animate);
}
animate();
`transform: translateX()`๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฆฌํ๋ก์ฐ๋ฅผ ์ ๋ฐํ์ง ์๊ณ ์์๋ฅผ ์ด๋์ํฌ ์ ์์ด ๋ ๋ถ๋๋ฝ๊ณ ์ฑ๋ฅ ์ข์ ์ ๋๋ฉ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ํ์ธํธ ์ฑ๋ฅ ์ต์ ํ๋ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ๋น ๋ฅด๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋๋ฉฐ ์ฆ๊ฑฐ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ์ดํดํ๊ณ , ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๋ฉฐ, ์ด ๊ฐ์ด๋์์ ์ค๋ช ํ ์ ๋ต์ ์ ์ฉํจ์ผ๋ก์จ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ํ์์ ๋ฐ๋ผ ์ต์ ํ ๊ธฐ์ ์ ์กฐ์ ํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. ๊ธ๋ก๋ฒ ์ปจํ ์คํธ๋ฅผ ๊ณ ๋ คํ๊ณ ๋ค์ํ ๋คํธ์ํฌ ์๋, ๊ธฐ๊ธฐ ์ฑ๋ฅ, ์ธํฐ๋ท ์ ์ ๋น์ฉ์ ๊ฐ์ง ์ฌ์ฉ์๋ค์๊ฒ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์๋ํ๋๋ก ์ต์ ํํ์ธ์. ์ด๋ฌํ ๊ดํ์ ์ฑํํ๋ฉด ์์น๋ ๊ธฐ๊ธฐ์ ๊ด๊ณ์์ด ๋ชจ๋ ์ฌ๋์ด ์ ๊ทผํ ์ ์๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์น ๊ฒฝํ์ ๋ง๋๋ ๋ฐ ๊ธฐ์ฌํ ๊ฒ์ ๋๋ค.